import java.io.IOException;
import java.io.RandomAccessFile;

public abstract class Sudoku {
	protected String nombrefic;
	protected Casillas [][] tablero=new Casillas[9][9];


	public Sudoku(String nombrfich) throws IOException{
		nombrefic=nombrfich;
		
		int incompleto [][]=new int[9][9];
		int solución [][]=new int[9][9];
	
		RandomAccessFile entrada=new RandomAccessFile(nombrefic, "r");
		
			for (int j=0;j<9;j++){
				for (int k=0;k<9;k++){
					incompleto[j][k]=entrada.readInt();
				}
			}
			
			for (int j=0;j<9;j++){
				for (int k=0;k<9;k++){
					solución[j][k]=entrada.readInt();
				}
			}
		entrada.close();
		for (int j=0;j<9;j++){
			for (int k=0;k<9;k++){
			tablero[j][k]=new Casillas(incompleto[j][k],solución[j][k]);
			}
		}
		

	}
	
	public String getFileName(){
		return nombrefic;
	}
	/**Busca si una casilla no es correcta para declarar el sudoku incompleto
	 * 
	 * @return
	 */
	public boolean esCorrecto(){
		
		boolean correcto = true;
		for (int j=0;j<tablero.length&&correcto;j++){
			for (int k=0;k<tablero[j].length&&correcto;k++){
				if(!tablero[j][k].isCorrecto()){
					correcto=false;
				}
		}	
		}

		return correcto;
	}
	
	
	public abstract String ayuda(int fila, int columna) throws AyudaException;
	
	/**
	 * Comprueba si el valor pertenece a valores entre el 1 y el 9.
	 * @param valor
	 * @return
	 */
	
	protected boolean compristra(int valor){
		boolean verr=true;
			if((valor<0||valor>9)){
				verr=false;
		}
		return verr;
	}
	
	/**
	 * Comprueba si el valor pertenece entre valores del 0 al 8
	 * @param valor
	 * @return
	 */
	
	protected boolean compr(int valor){
		boolean verr=true;
			if((valor<0||valor>8)){
				verr=false;
		}
		return verr;
	}
	
	public abstract String poner(int columna, int fila, int valor) throws PonerException;
	
	/**
	 * Muestra el sudoku.
	 */
	
	public void showEstado(){
		for (int j=0;j<tablero.length;j++){
			for (int k=0;k<tablero[j].length;k++){
				if(tablero[j][k].getValor()==-1){
					System.out.print("- ");
				}else System.out.print(tablero[j][k].getValor()+" ");
			}
					System.out.println();	
		}
	}
}